﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Web;

namespace FrameWork.BasePage
{
    /// <summary>
    /// 继承于Page页面的基类，它主要用来保存刷新的次数和客户端票证的值，
    /// 并且提供一个属性来标志此页面是否是重复提交的页面
    /// 还有缺点： (1)服务端票证保存在Session里，Session是会过期的，这时候应该加一个Session超时的判断;
    ///          (2)还有一个最大的缺点，此解决方案不能配合IFrame使用，因为在IFrame中，客户端页面会加载两次（即IFrame
    ///外的父窗口和IFrame导向的子窗口），导致客户端票证与服务端票证相同，那么在IFrame中，提交始终是重复提交;
    ///          (3)回退之后第一次点击可以探明是重复提交，但是第二次点击仍然会说明是正常提交。
    /// </summary>
    public class BasePage : System.Web.UI.Page
    {

        // 常量 
        public const string RefreshTicketCounter = "RefreshTicketCounter";
        public BasePage()
        {
            this.PreRender += new EventHandler(RefreshPage_PreRender);
        }
        //标志页面是否按F5进行重复刷新的标志属性
        public bool IsPageRefresh
        {
            get
            {
                object o = HttpContext.Current.Items[RefreshAction.PageRefreshEntry];
                if (o == null)
                    return false;
                return (bool)o;
            }
        }
        //增加刷新票证的内部计数器 
        public void TrackRefreshState()
        {
            //初始化刷新计数器 
            InitRefreshState();
            //将刷新计数器加1，然后放进Session
            int ticket = Convert.ToInt32(Session[RefreshTicketCounter]) + 1;
            Session[RefreshTicketCounter] = ticket;
        }

        //初始化刷新计数器  
        private void InitRefreshState()
        {

            if (Session[RefreshTicketCounter] == null)
                Session[RefreshTicketCounter] = 0;
        }

        // PreRender事件处理器
        private void RefreshPage_PreRender(object sender, EventArgs e)
        {
            //在页面呈现之前就保存票证值到隐藏域 
            SaveRefreshState();
        }

        //创建隐藏域来保存当前请求的票证值 
        private void SaveRefreshState()
        {
            //将票证计数器的值加1，然后将此值注册到当前票证隐藏域中 
            int ticket = Convert.ToInt32(Session[RefreshTicketCounter]) + 1;
            this.ClientScript.RegisterHiddenField(RefreshAction.CurrentRefreshTicketEntry, ticket.ToString());

        }

    }//end class  

}
